home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / docs / corsoguide / idcmp-16.txt < prev    next >
Text File  |  1992-09-03  |  5KB  |  76 lines

  1. Comunicazione con Intuition: IDCMP
  2.  
  3. Come abbiamo detto la puntata scorsa, la finestra rappresenta il luogo in
  4. cui il programma visualizza i dati per l'utente, ed il luogo in cui l'utente
  5. indica al programma quale operazione deve compiere; mentre le prime azioni
  6. sono svolte dalla libreria grafica e da alcune funzioni di Intuition che
  7. permettono di visualizzare testi e grafici sulla finestra, le operazioni di
  8. input su quest'utlima sono realizzate da IDCMP.
  9. IDCMP è un acronimo che significa Intuition Direct Communications Message Port,
  10. vale a dire porta messaggi per la comunicazione diretta con intuition; in altre
  11. parole intuition permette di avvissare e comunicare qualsiasi input (mouse,
  12. finestra, gadget, menù ecc.) avvenuto in una determinata finestra,
  13. all'applicazione; come avete potuto capire dal nome, IDCMP è una porta
  14. messaggi exec associata ad una finestra, che riceve un formato particolare
  15. di messaggio, IntuiMessage contenente oltre alle informazioni del messaggio
  16. exec, il tipo di evento di input, altri eventuali dati su di esso, su quale
  17. finestra è avvenuto ed altro ancora. Il programmatore deve specificare,
  18. all'atto dell'apertura della finestra, con il tag WA_IDCMP per quali
  19. messaggi deve essere avvisato mediante IDCMP; in tale maniera posso
  20. chiedere di essere semplicemente ratificato di eventi sul menù, perché devo
  21. attuare operazioni solo in risposta di questo tipo di evento; se tale campo
  22. è diverso da NULL la porta IDCMP che riceve questi messaggi di intuition,
  23. viene creata automaticamente al momento dell'apertura della finestra; se
  24. tale tag è NULL non viene aperta la porta IDCMP. Questo vuol dire che ogni
  25. finestra può avere una propria porta, ed ognuna di queste riceve i messaggi
  26. indicati all'atto dell'apertura, quando questa è attiva. E' comunque
  27. possibile modificare gli eventi per i quali essere avvisati, mediante la
  28. seguente funzione:
  29.  
  30. Successo = ModifyIDCMP(Finestra,IDCMPFlags);
  31.  
  32. Dove "Finestra" è il puntatore alla struttura Window della finestra;
  33. IDCMPFlags è una ULONG dello stesso tipo passato in WA_IDCMP indicante
  34. quali eventi di input gestire; Successo (utilizzato a partire da V37) se
  35. vale NULL vuol dire che non è stato possibile modificare l'IDCMP; dato che,
  36. se la precedente configurazione poteva essere NULL e modificando
  37. l'IDCMPFlags impostando almeno un evento il sistema provvede direttamente
  38. da ModifyIDCMP a creare la porta IDCMP, può accadere che non venga aperta
  39. (mancanza di memoria o altro); il puntatore alla porta creata dal sistema è
  40. presente nel campo UserPort della struttura Window.
  41. Tirando le somme, il nucleo di ogni applicazione si occupa di attendere dalla
  42. porta IDCMP messaggi di Intuition (utilizzando Wait o WaitPort come visto in
  43. una delle precedenti puntate) e di rispondere con determinate azioni quando
  44. questi arrivano; ad esempio se si seleziona l'opzione "Open" del menù,
  45. bisogna far apparire il file requester per scegliere il file da aprire; si
  46. può realizzare (vedere listati) una routine che si occupa proprio di
  47. attendere un messaggio.
  48. Come abbiamo prima accennato ogni finestra aperta può avere
  49. una propria porta IDCMP; questo non è necessario, poiché se un'applicazione
  50. apre più di una finestra, può gestire tutti i messaggi con un'unica porta,
  51. dato che nella struttura IntuiMessage vi è anche il campo per determinare
  52. da quale finestra arriva il messaggio; in altre parole la porta IDCMP viene
  53. condivisa fra più finestre; per fare questo bisogna effettuare i seguenti
  54. passi:
  55. 1 - Creare una porta messaggi exec (che sarà utilizzata come porta IDCMP)
  56.     mediante CreatePort o CreateMsgPort
  57. 2 - Aprire la finestra con il tag WA_IDCMP impostato a NULL; questo impedirà
  58.     ad Intuition di aprire una porta per quella finestra
  59. 3 - Inserire il puntatore della porta creata nel punto 1 nel campo UserPort
  60.     della finestra appena aperta
  61. 4 - Chiamare ModifyIDCMP() per impostare i corretti IDCMPFlags per quella
  62.     finestra; attenzione a non chiamare ModifyIDCMP(finestra,NULL) poiché si
  63.     chiuderebbe la porta condivisa
  64. 5 - Quando l'applicazione decide di chiudere una finestra con una porta IDCMP
  65.     condivisa, bisogna che vengano prima risposti tutti i messaggi, presenti
  66.     nella porta, di quella finestra; esiste per questo una funzione
  67.     denominata CloseWindowSafely, riportata sul ROM Kernel Manual che elimina
  68.     dalla porta tutti i messaggi prima di chiudere la finestra (vedere
  69.     listati); la funzione dopo aver eliminato tutti i messaggi dalla porta,
  70.     assegna al campo UserPort della finestra NULL e chiama
  71.     ModifyIDCMP(finestra,NULL) in modo da interrompere il flusso di messaggi
  72.     senza liberare la porta (che potrebbe servire ad altre finestre)
  73. 6 - Una volta chiuse tutte le finestre, bisogna deallocare la porta mediante
  74.     DeletePort (se è stata usata CreatePort) o DeleteMsgPort (se è stata
  75.     usata CreateMsgPort).
  76.